package com.huan;


import java.util.HashMap;
import java.util.Map;

/**
 * 使用synchronized实现线程的轮询
 * @author chenbin78
 * @version 1.0
 * @create_date 2021/4/19 10:06
 */
public class SynchronizedTest {

    Map<Integer, Integer> map = new HashMap<>();

    private int count = 1;

    synchronized void put() {
        for (int i = 0; i < 10; i++) {
            map.put(count, count);
            System.out.println(Thread.currentThread().getName() + " " + count);
            count ++ ;
            //唤醒get线程
            this.notify(); //等待队列中只有一个线程，所以不使用notfiyAll()
            try {
                //等待get线程取值之后执行
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + "执行完毕！");
    }

    synchronized void get() {
        for (int i = 0; i < 10; i++) {
            Integer integer = map.get(count - 1);
            System.out.println(Thread.currentThread().getName() + "取值为：" + integer);
            //唤醒put线程
            this.notify(); //等待队列中只有一个线程，所以不使用notfiyAll()
            try {
                //等待put线程赋值之后执行
                //最多等待1s, 等待1s后没被唤醒则自己醒过来
                //因为最后一次循环时, 当前方法让出CPU后, 再也不会被唤醒了
                this.wait(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + "执行完毕");
    }

}